home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 November: Tool Chest / Dev.CD Nov 98 TC.toast / Sample Code / Processes / ProcDoggie2.1b2 / UGlobals.p < prev    next >
Encoding:
Text File  |  1997-11-03  |  20.0 KB  |  598 lines  |  [TEXT/CWIE]

  1. UNIT UGlobals;
  2.  
  3. {-------------------------------------------------------------------------------
  4.     File:        UGlobals.p
  5.  
  6.     Contains:    Application utilities.
  7.  
  8.     Written by:    Forrest Tanaka
  9.  
  10.     Copyright:    © 1988-1997 by Apple Computer, Inc., all rights reserved.
  11.  
  12.     Change History (most recent first):
  13.  
  14.     You may incorporate this sample code into your applications without
  15.     restriction, though the sample code has been provided "AS IS" and the
  16.     responsibility for its operation is 100% yours.  However, what you are
  17.     not permitted to do is to redistribute the source as "DSC Sample Code"
  18.     after having made changes. If you're going to re-distribute the source,
  19.     we require that you make it clear in the source that the code was
  20.     descended from Apple Sample Code, but that you've made changes.
  21. --------------------------------------------------------------------------------
  22. #
  23. # This unit contains declarations and routines that didn’t seem to fit into any
  24. # other unit in this application.
  25. #
  26. -------------------------------------------------------------------------------}
  27. {[j=20/57/1$] Pasmat Options}
  28.  
  29. INTERFACE
  30.  
  31. (*******************************************************************************
  32. * Used Units
  33. *******************************************************************************)
  34.  
  35.     USES
  36.         Dialogs
  37.         ;
  38.         
  39. (*******************************************************************************
  40. * Constants
  41. *******************************************************************************)
  42.  
  43.     CONST
  44.         rMemErrMessages        = 1000; {Resource ID of memory error message STR#}
  45.         kMemErrAppOpenMsg      = 1;    {Not enough memory to open application}
  46.         kMemErrProcListOpenMsg = 2;    {Not enough mem to open process list wind}
  47.         kMemErrLowMemWarnMsg   = 3;    {Free memory is low; proceed with caution}
  48.         kMemErrProcInfoOpenMsg = 4;    {Not enough mem to open process info wind}
  49.  
  50.         rResErrMessages     = 1001; {Resource ID of resource error message STR#}
  51.         kResErrAppDamageMsg = 1;    {Application is damaged}
  52.  
  53.         rMiscErrMessages   = 1002; {Resource ID of misc. error message STR#}
  54.         kMiscErrUnknownMsg = 1;    {Unknown error}
  55.         kMiscSystemTooSmall = 2;    {Unknown error}
  56.  
  57.         rMiscWrnMessages     = 2000; {Resource ID of misc. warning message STR#}
  58.         kMiscWrnUncleanMsg   = 1;    {Application not 32-bit clean warning}
  59.         kMiscWrnLaunchMemMsg = 2;    {Not enough memory to launch}
  60.         kMiscWrnQuitSureMsg     = 3;    {Sure you want to Quit?}
  61.  
  62.         kMaxSleepTime = 60; {Max WNE sleep time in ticks, 1 second in this case}
  63.  
  64.  
  65. (*******************************************************************************
  66. * Global Variables
  67. *******************************************************************************)
  68.  
  69.     VAR
  70.         gError:        Integer; {Generic application error code}
  71.         gQuitting:     Boolean; {TRUE if user chose Quit command}
  72.  
  73.  
  74. (*******************************************************************************
  75. * DoQuit - Handle Quit command
  76. *
  77. * This routine is called when this application should quit.  It’s called
  78. * when the user chooses the Quit command from the file menu or when a 'quit'
  79. * AppleEvent is received.  It puts up a quit confirm dialog and returns noErr if
  80. * the user OKs the quit.
  81. *******************************************************************************)
  82.  
  83.     FUNCTION DoQuit: OSErr;
  84.  
  85. (*******************************************************************************
  86. * HasColourQuickDraw - Returns true if we have Colour QuickDraw
  87. *******************************************************************************)
  88.  
  89.     FUNCTION HasColourQuickDraw : Boolean;
  90.  
  91. (*******************************************************************************
  92. * ShowStopAlert - Show a stop alert
  93. *
  94. * This routine puts up a standard stop alert with just an OK button and a
  95. * specified message.  messageClass specifies the STR# resource ID which contains
  96. * the message to display and messageIndex specifies the index (the first message
  97. * is index 1) into that STR# of the message to display.
  98. *******************************************************************************)
  99.  
  100.     FUNCTION ShowStopAlert (messageClass: Integer;
  101.                             messageIndex: Integer; VAR itemHit: Integer): OSErr;
  102.  
  103.  
  104. (*******************************************************************************
  105. * ShowCautionOKCancelAlert - Show a caution alert with an OK and Cancel button
  106. *
  107. * This routine puts up a standard caution alert with just an OK button, a Cancel
  108. * button, and a specified message.  messageClass specifies the STR# resource ID
  109. * which contains the message to display and messageIndex specifies the index
  110. * (the first message is index 1) into that STR# of the message to display.
  111. *******************************************************************************)
  112.  
  113.     FUNCTION ShowCautionOKCancelAlert (messageClass: Integer;
  114.                                        messageIndex: Integer; VAR itemHit: Integer): OSErr;
  115.  
  116.  
  117. (*******************************************************************************
  118. * ShowCautionOKAlert - Show a caution alert with just an OK button
  119. *
  120. * This routine puts up a standard caution alert with just an OK button and a
  121. * specified message.  messageClass specifies the STR# resource ID which contains
  122. * the message to display and messageIndex specifies the index (the first message
  123. * is index 1) into that STR# of the message to display.
  124. *******************************************************************************)
  125.  
  126.     FUNCTION ShowCautionOKAlert (messageClass: Integer;
  127.                                  messageIndex: Integer; VAR itemHit: Integer): OSErr;
  128.  
  129.  
  130. (*******************************************************************************
  131. * ShowAboutBox - Show the About box
  132. *
  133. * The About box for this application is displayed.  This is just a simple alert
  134. * box with an OK button.  The name of this application is displayed as is its
  135. * version number.
  136. *******************************************************************************)
  137.  
  138.     PROCEDURE ShowAboutBox;
  139.  
  140.  
  141. (*******************************************************************************
  142. * CreateWindow - Create a window
  143. *
  144. * This routine creates a window using the WIND resource template with a resource
  145. * ID of windowTmplID in front of all existing windows.  A pointer to this window
  146. * is returned.  If we’re running on a Color QuickDraw machine, the window is
  147. * created as a color window.  This window must be disposed of by calling
  148. * CloseWindow followed by DisposePtr on the window’s WindowRecord.  The window
  149. * shouldn’t be closed using DisposeWindow.  When this routine returns, the new
  150. * window is the current GrafPort.
  151. *
  152. * The window isn’t explicitly repositioned from its position as defined by the
  153. * resource definition.  Instead, I use the window-positioning utilities.  This
  154. * isn’t documented at this time and it isn’t even certain the these utilities
  155. * will be implemented in the final release of system software 7.0.  Use ResEdit
  156. * 2.1’s WIND editor to control the window-positioning utilities.
  157. *
  158. * If there isn’t enough memory for the window, then gError global is set to
  159. * memFullErr.  If the WIND resource couldn’t be loaded, gError is set to
  160. * resNotFound.  If anything else went wrong while creating the window, then
  161. * gError is set to dsSysErr.
  162. *******************************************************************************)
  163.  
  164.     FUNCTION CreateWindow (windowTmplID: Integer): WindowPtr;
  165.  
  166.  
  167. (*******************************************************************************
  168. * CreateDialog - Create a dialog window
  169. *
  170. * This routine creates a dialog window using the WIND resource template with a
  171. * resource ID of windowTmplID in front of all existing windows.  A pointer to
  172. * this window is returned.  If we’re running on a Color QuickDraw machine, the
  173. * window is created as a color window.  This window must be disposed of by
  174. * calling CloseWindow followed by DisposePtr on the window’s DialogRecord.  The
  175. * window shouldn’t be closed using DisposeWindow.  When this routine returns,
  176. * the new dialog is the current GrafPort.
  177. *
  178. * The window isn’t explicitly repositioned from its position as defined by the
  179. * resource definition.  Instead, I use the window-positioning utilities.  This
  180. * isn’t documented at this time and it isn’t even certain the these utilities
  181. * will be implemented in the final release of system software 7.0.  Use ResEdit
  182. * 2.1’s WIND editor to control the window-positioning utilities.
  183. *
  184. * If there isn’t enough memory for the window, then gError global is set to
  185. * memFullErr.  If the WIND resource couldn’t be loaded, gError is set to
  186. * resNotFound.  If anything else went wrong while creating the window, then
  187. * gError is set to dsSysErr.
  188. *******************************************************************************)
  189.  
  190.     FUNCTION CreateDialog (dialogTmplID: Integer): DialogPtr;
  191.  
  192.  
  193. (*******************************************************************************
  194. * InitGlobals - Initialise this module
  195. *******************************************************************************)
  196.  
  197.     PROCEDURE InitGlobals;
  198.  
  199. IMPLEMENTATION
  200.  
  201.     USES
  202.         Notification
  203.         ,Resources
  204.         ,TextUtils
  205.         ,GestaltEqu
  206.         ,AppleEvents
  207.         
  208.         ,UEmergMem
  209.         ,UEvents
  210.         ;
  211.  
  212. (*******************************************************************************
  213. * Constants
  214. *******************************************************************************)
  215.  
  216.     CONST
  217.         rOKAlertID       = 6010; {Resource ID of alert with OK button}
  218.         rOKCancelAlertID = 6011; {Resource ID of alert with OK and Cancel buttons}
  219.  
  220.         rIconSuiteID   = 128; {Resource ID of application icon suite}
  221.         rAppNameString = 0;   {Resource ID of application name}
  222.         rAboutAlert    = 258; {Resource ID of About alert}
  223.  
  224.  
  225. (*******************************************************************************
  226. * Variables
  227. *******************************************************************************)
  228.  
  229.     VAR
  230.         gNotifyAlertIdleUPP: AEIdleUPP;
  231.  
  232.     VAR
  233.         gNotification: NMRec; {Notification record}
  234.  
  235.  
  236. {$S Main}
  237. (*******************************************************************************
  238. * Public: DoQuit
  239. *
  240. * The gQuitting global variable is set to TRUE.  This causes the main event loop
  241. * to terminate on the next iteration.
  242. *******************************************************************************)
  243.  
  244.     FUNCTION DoQuit: OSErr;
  245.  
  246.         VAR
  247.             error: OSErr;
  248.             itemHit: Integer;
  249.  
  250.     BEGIN
  251.         error := ShowCautionOKCancelAlert (rMiscWrnMessages, kMiscWrnQuitSureMsg, itemHit);
  252.         IF error = noErr THEN
  253.             if itemHit = ok THEN
  254.                 gQuitting := TRUE
  255.             ELSE
  256.                 error := userCanceledErr;
  257.         DoQuit := error;
  258.     END;
  259.  
  260.  
  261. {$S Main}
  262. (*******************************************************************************
  263. * HasColourQuickDraw
  264. *
  265. * Returns true if we have Colour QuickDraw.  Note we do not use 
  266. * gestaltQuickdrawFeatures -> gestaltHasColor because that bit is set
  267. * on a 68000 machine running System 7.
  268. *******************************************************************************)
  269.     FUNCTION HasColourQuickDraw : Boolean;
  270.         VAR
  271.             qdVersion : LongInt;
  272.     BEGIN
  273.         HasColourQuickDraw := ( ( Gestalt (gestaltQuickdrawVersion, (*<*)qdVersion) = noErr) &
  274.                 (qdVersion > gestaltOriginalQD) );
  275.     END;
  276.  
  277.  
  278. {$S Main}
  279. (*******************************************************************************
  280. * Private: NotifyAlert - Present a notification for an alert
  281. *
  282. * This routine is called to present a notification to the user in the form of a
  283. * flashing icon in the application menu whenever an alert from this program is
  284. * displayed and the application is in the background.  We do this by calling
  285. * AEInteractWithUser, which is very useful utility routine provided by the
  286. * AppleEvent Manager for this very purpose.
  287. *******************************************************************************)
  288.  
  289.     FUNCTION NotifyAlertIdleProc(VAR theEvent: EventRecord; VAR sleepTime: LONGINT; VAR mouseRgn: RgnHandle): BOOLEAN;
  290.     BEGIN
  291.         {$unused sleepTime}
  292.         {$unused mouseRgn}
  293.         CASE theEvent.what OF
  294.             updateEvt,
  295.              activateEvt,
  296.              osEvt:
  297.                 BEGIN
  298.                     DoEvent(theEvent);
  299.                 END;
  300.             OTHERWISE
  301.                 (* do nothing *)
  302.         END;
  303.         NotifyAlertIdleProc := FALSE;        (* Continue waiting. *)
  304.     END;
  305.  
  306.     FUNCTION NotifyAlert : OSErr;
  307.  
  308.         VAR
  309.             iconSuite: Handle;      {Handle to the icon suite}
  310.             error:     OSErr;
  311.  
  312.     BEGIN
  313.         (* If this application isn’t in front, post a notification *)
  314.         (* Get the small icon for this application *)
  315.         iconSuite := Get1Resource ('SICN', rIconSuiteID);
  316.         WITH gNotification DO
  317.             BEGIN
  318.                 (*WITH*)qType := ORD (nmtype);
  319.                 (*WITH*)nmMark := 1;
  320.                 (*WITH*)nmIcon := iconSuite;
  321.                 (*WITH*)nmSound := Handle(-1);
  322.                 (*WITH*)nmStr := NIL;
  323.                 (*WITH*)nmResp := NIL;
  324.                 (*WITH*)nmRefCon := 0
  325.             END;
  326.  
  327.         error := AEInteractWithUser(kAEDefaultTimeout, @gNotification, gNotifyAlertIdleUPP);
  328.         IF error = noErr THEN
  329.             InitCursor;
  330.         NotifyAlert := error;
  331.     END;
  332.  
  333.  
  334. {$S Main}
  335. (*******************************************************************************
  336. * Public: ShowStopAlert
  337. *
  338. * NotifyAlert is called to present a notification to the user in case this
  339. * application is in the background at the time of the alert.  This routine then
  340. * removes the notification after StopAlert is called.
  341. *******************************************************************************)
  342.  
  343.     FUNCTION ShowStopAlert (messageClass: Integer;
  344.                             messageIndex: Integer; VAR itemHit: Integer): OSErr;
  345.  
  346.         VAR
  347.             aMessage: Str255; {Contents of message to place in alert}
  348.             error: OSErr;
  349.             
  350.     BEGIN
  351.         (* Put the specified message into the dialog parameter text *)
  352.         GetIndString ((*<*)aMessage, messageClass, messageIndex);
  353.         ParamText (aMessage, '', '', '');
  354.  
  355.         (* Show the stop alert *)
  356.         error := NotifyAlert;
  357.         IF error = noErr THEN
  358.             itemHit := StopAlert (rOKAlertID, NIL);
  359.                 
  360.         ShowStopAlert := error;
  361.     END;
  362.  
  363.  
  364. {$S Main}
  365. (*******************************************************************************
  366. * Public: ShowCautionOKCancelAlert
  367. *
  368. * NotifyAlert is called to present a notification to the user in case this
  369. * application is in the background at the time of the alert.  This routine then
  370. * removes the notification after ShowCautionOKCancelAlert is called.
  371. *******************************************************************************)
  372.  
  373.     FUNCTION ShowCautionOKCancelAlert (messageClass: Integer;
  374.                                        messageIndex: Integer; VAR itemHit: Integer): OSErr;
  375.  
  376.         VAR
  377.             aMessage: Str255; {Contents of message to place in alert}
  378.             error: OSErr;
  379.  
  380.     BEGIN
  381.         (* Put the specified message into the dialog parameter text *)
  382.         GetIndString ((*<*)aMessage, messageClass, messageIndex);
  383.         ParamText (aMessage, '', '', '');
  384.  
  385.         (* Show the stop alert *)
  386.         error := NotifyAlert;
  387.         IF error = noErr THEN
  388.             itemHit := CautionAlert (rOKCancelAlertID, NIL);
  389.  
  390.         ShowCautionOKCancelAlert := error;
  391.     END;
  392.  
  393.  
  394. {$S Main}
  395. (*******************************************************************************
  396. * Public: ShowCautionOKAlert
  397. *
  398. * NotifyAlert is called to present a notification to the user in case this
  399. * application is in the background at the time of the alert.  This routine then
  400. * removes the notification after ShowCautionOKAlert is called.
  401. *******************************************************************************)
  402.  
  403.     FUNCTION ShowCautionOKAlert (messageClass: Integer;
  404.                                  messageIndex: Integer; VAR itemHit: Integer): OSErr;
  405.  
  406.         VAR
  407.             aMessage: Str255; {Contents of message to place in alert}
  408.             error:    OSErr;
  409.  
  410.     BEGIN
  411.         (* Put the specified message into the dialog parameter text *)
  412.         GetIndString ((*<*)aMessage, messageClass, messageIndex);
  413.         ParamText (aMessage, '', '', '');
  414.  
  415.         (* Show the stop alert *)
  416.         error := NotifyAlert;
  417.         IF error = noErr THEN
  418.             itemHit := CautionAlert (rOKAlertID, NIL);
  419.         
  420.         ShowCautionOKAlert := error;
  421.     END;
  422.  
  423.  
  424. {$S Main}
  425. (*******************************************************************************
  426. * Public: ShowAboutBox
  427. *
  428. * The name and the version number of this application are retrieved from
  429. * resources.  They’re then displayed in the About box using the ParamText
  430. * mechanism.
  431. *******************************************************************************)
  432.  
  433.     PROCEDURE ShowAboutBox;
  434.  
  435.         VAR
  436.             appNameRes: StringHandle; {Handle to name of application}
  437.             curVersion: VersRecHndl;  {Handle to version record of this app}
  438.             appName:    Str255;       {Name of this application}
  439.             verNum:     Str255;       {Long version number of this application}
  440.             itemHit:    Integer;      {Item number of clicked alert item; ignored}
  441.  
  442.     BEGIN
  443.         (* Get the name of this application *)
  444.         appNameRes := GetString (rAppNameString);
  445.         IF appNameRes <> NIL THEN
  446.             appName := appNameRes^^
  447.         ELSE
  448.             appName := '?';
  449.  
  450.         (* Get the version information of this application *)
  451.         curVersion := VersRecHndl (Get1Resource ('vers', 1));
  452.         IF curVersion <> NIL THEN
  453.             (* Get the long version number *)
  454.             verNum := StringPtr(ORD(@curVersion^^.shortVersion) +
  455.                     ORD(curVersion^^.shortVersion[0]) + 1)^
  456.         ELSE
  457.             verNum := '?';
  458.  
  459.         (* Show the About alert *)
  460.         ParamText(appName, verNum, '', '');
  461.         itemHit := Alert (rAboutAlert, NIL);
  462.     END;
  463.  
  464.  
  465. {$S Main}
  466. (*******************************************************************************
  467. * Public: CreateWindow
  468. *
  469. * A WindowRecord is allocated on the heap before GetNewWindow is called.  This
  470. * is done to reduce heap fragmentation.
  471. *******************************************************************************)
  472.  
  473.     FUNCTION CreateWindow (windowTmplID: Integer): WindowPtr;
  474.  
  475.         VAR
  476.             windStore: Ptr;       {Pointer to window record}
  477.             aWindow:   WindowPtr; {Pointer to the new window}
  478.  
  479.         PROCEDURE RecoverError (error: Integer);
  480.  
  481.         BEGIN
  482.             IF aWindow <> NIL THEN
  483.                 CloseWindow (aWindow);
  484.             IF windStore <> NIL THEN
  485.                 DisposePtr (windStore);
  486.             gError := error;
  487.             CreateWindow := NIL;
  488.             EXIT (CreateWindow)
  489.         END;
  490.  
  491.     BEGIN
  492.         windStore := NIL;
  493.         aWindow := NIL;
  494.  
  495.         (* Allocate window record *)
  496.         windStore := NewPtrMargin (SIZEOF (WindowRecord), kAllocApp,
  497.                 NOT kAllocClr);
  498.  
  499.         (* Create the new window *)
  500.         IF windStore = NIL THEN
  501.             RecoverError (memFullErr)
  502.         ELSE
  503.             BEGIN
  504.                 (* Create the new window *)
  505.                 IF NOT HasColourQuickDraw THEN
  506.                     aWindow := GetNewWindow (windowTmplID, windStore, WindowPtr(-1))
  507.                 ELSE
  508.                     aWindow := GetNewCWindow (windowTmplID, windStore,
  509.                              WindowPtr(-1));
  510.                 IF FailLowMemory (0) THEN
  511.                     RecoverError (memFullErr)
  512.                 ELSE IF ResError <> noErr THEN
  513.                     IF ResError = memFullErr THEN
  514.                         RecoverError (memFullErr)
  515.                     ELSE IF (ResError = noErr) | (ResError = resNotFound) THEN
  516.                         RecoverError (resNotFound)
  517.                     ELSE
  518.                         RecoverError (dsSysErr);
  519.  
  520.                 SetPort (aWindow);
  521.                 SetWRefCon (aWindow, 0)
  522.             END;
  523.         CreateWindow := aWindow
  524.     END;
  525.  
  526.  
  527. {$S Main}
  528. (*******************************************************************************
  529. * Public: CreateDialog
  530. *
  531. * A DialogRecord is allocated on the heap before GetNewWindow is called.  This
  532. * is done to reduce heap fragmentation.
  533. *******************************************************************************)
  534.  
  535.     FUNCTION CreateDialog (dialogTmplID: Integer): DialogPtr;
  536.  
  537.         VAR
  538.             dlogStore: Ptr;       {Pointer to dialog record}
  539.             aDialog:   DialogPtr; {Pointer to the new dialog window}
  540.  
  541.         PROCEDURE RecoverError (error: Integer);
  542.  
  543.         BEGIN
  544.             IF aDialog <> NIL THEN
  545.                 CloseWindow (aDialog);
  546.             IF dlogStore <> NIL THEN
  547.                 DisposePtr (dlogStore);
  548.             gError := error;
  549.             CreateDialog := NIL;
  550.             EXIT (CreateDialog)
  551.         END;
  552.  
  553.     BEGIN
  554.         dlogStore := NIL;
  555.         aDialog := NIL;
  556.  
  557.         (* Allocate window record *)
  558.         dlogStore := NewPtrMargin (SizeOf (DialogRecord), kAllocApp,
  559.                 NOT kAllocClr);
  560.  
  561.         (* Create the new window *)
  562.         IF dlogStore = NIL THEN
  563.             RecoverError (memFullErr)
  564.         ELSE
  565.             BEGIN
  566.                 IF NOT HasColourQuickDraw THEN
  567.                     aDialog := GetNewWindow (dialogTmplID, dlogStore, WindowPtr(-1))
  568.                 ELSE
  569.                     aDialog := GetNewCWindow (dialogTmplID, dlogStore,
  570.                             WindowPtr(-1));
  571.                 IF FailLowMemory (0) THEN
  572.                     RecoverError (memFullErr)
  573.                 ELSE IF ResError <> noErr THEN
  574.                     IF ResError = memFullErr THEN
  575.                         RecoverError (memFullErr)
  576.                     ELSE IF (ResError = noErr) | (ResError = resNotFound) THEN
  577.                         RecoverError (resNotFound)
  578.                     ELSE
  579.                         RecoverError (dsSysErr);
  580.  
  581.                 SetPort (aDialog);
  582.                 SetWRefCon (aDialog, 0)
  583.             END;
  584.         CreateDialog := aDialog
  585.     END;
  586.  
  587. {$S Startup}
  588. (*******************************************************************************
  589. * Public: InitGlobals
  590. *******************************************************************************)
  591.  
  592.     PROCEDURE InitGlobals;
  593.     BEGIN
  594.         gNotifyAlertIdleUPP := NewAEIdleProc(@NotifyAlertIdleProc);
  595.     END;
  596.  
  597. END.
  598.